package com.gsi.webstore.platform.storefront.capi.order;

import java.util.Collection;

import com.gsi.webstore.platform.adapter.taxes_duties_fees.capi.calculation.ComputedErrorItem;
import com.gsi.webstore.platform.adapter.taxes_duties_fees.capi.calculation.ComputedTaxInfoItem;
import com.intershop.beehive.bts.capi.payment.PaymentInstrumentInfo;
import com.intershop.beehive.foundation.quantity.Money;
import com.intershop.component.foundation.capi.spreadsheet.ComputedMoneyItem;
import com.intershop.sellside.appbase.b2c.capi.calculation.LineItemCtnrCalculationResultView;
import com.intershop.sellside.appbase.b2c.capi.order.CostInformationBO;
import com.intershop.sellside.appbase.b2c.capi.order.Discount;

public interface GSILineItemCtnrCalculationResultView extends LineItemCtnrCalculationResultView
{

    Collection<ComputedMoneyItem> getPLIDiscountsOnItemItems(final String id);

    Collection<ComputedTaxInfoItem> getPLITaxInfoItems();

    Money getPLISubTotalsDuty();

    Collection<ComputedTaxInfoItem> getShippingPLITaxInfoItems();

    Collection<Discount> getAppliedDiscountsOnItem(final String lineItemID);

    Collection<Discount> getAppliedDiscountsOnShipping(final String lineItemID);

    Money getTaxAmount(final String lineItemID);

    Collection<GSITaxInformationBO> getItemPriceBasedTaxes(final String lineItemID);

    Collection<GSITaxInformationBO> getShippingCostBasedTaxes(final String lineItemID);

    Money getDutyAmount(final String lineItemID);

    Collection<GSITaxInformationBO> getDuties(final String lineItemID);

    Money getFeesAmount(final String lineItemID);

    Collection<GSIExtraChargeInformationBO> getGeographicalFees(final String lineItemID);

    Collection<GSIExtraChargeInformationBO> getImportFees(final String lineItemID);

    /**
     *
     * @return The total of all duties and fees applied to the cart
     */
    Money getTotalDutiesAndFees();

    /**
     *
     * @return the cost informations of taxes group by imposition.
     */
    Collection<CostInformationBO> getTaxGroups();

    /**
     *
     * @return the cost informations of duties and fees group by imposition.
     */
    Collection<CostInformationBO> getDutiesAndFeesGroups();

    /**
     * Returns a computed error item of the tax duty fee service.
     * @return the computed error item,
     *      <code>null</code> if no error exists
     */
    ComputedErrorItem getTaxServiceErrorItem();

    @Override
    /**
     * Gets the payment costs.
     *
     * @return the payment costs
     */
    Money getPaymentCosts();

    @Override
    /**
     * Gets the payment cost of a given payment instrument info.
     *
     * @param pii the payment instrument info
     * @return the payment cost
     */
    Money getPaymentCost(final PaymentInstrumentInfo pii);

    /**
     * Gets the net base price of the given PLI id.
     * (e.g. to return net prices if pricelist is maintained with gross based prices)
     *
     * @param id the id
     * @return the net base price
     */
    Money getPLINetBasePrice(final String lineItemID);

    /**
     * Gets the net base price of the given gift options id.
     * (e.g. to return net prices if pricelist is maintained with gross based prices)
     *
     * @param id the id
     * @return the net base price
     */
    Money getGiftOptionNetPrice(final String lineItemID);

    Money getShippingPLINetCosts(final String lineItemID);

    Money getWarrantyLineItemNetTotal(final String parentPLIID);

    /**
     * Gets the shipping tax discount info items.
     *
     * @return the shipping tax discount info items
     */
    Collection<ComputedTaxInfoItem> getShippingTaxDiscountInfoItems();

    /**
     * Gets the pLI tax discount info items.
     *
     * @return the pLI tax discount info items
     */
    Collection<ComputedTaxInfoItem> getPLITaxDiscountInfoItems();

    /**
     * Gets the tax discount amounts.
     *
     * @return the tax discount amounts
     */
    Collection<ComputedMoneyItem> getNetDiscountAmounts();
}